#coding=utf-8
import math
import time
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from measurement.preprocess_probe_data import *
from pylab import mpl
from utils.mylib_db import *
from utils.mylib_utils import *
from measurement.measurement_utils import *
from utils.gum_algorithm23.draw_fig import *
from measurement.open_dir_and_file import *

"""
不确定度评定算法结果图示：二维彩图

# 202402添加新功能：（额外功能，现画）
# 评定结果查询中实现二维彩图和等值线。# 方案：Python画图，提供链接给前台界面展示。
# 画图的输入参数为一组数据，包括：高度、（探测值、）不确定度、时间、参量类型。

"""
db_raw_l2_precessed_table = "bt_data"

# 二维彩图保存路径（固定不变）
draw_figure_save_path = "media/data/figure_2Dimension"
# db_table_draw_figure = "bt_data_figure"


def drawFigureForUncertaintyResult(param):
    """
    不确定度评定
    """
    print("进入不确定度评定结果展示过程：展示包含等值线二维彩图..")
    print("参数情况：")
    print(param)

    #参数处理
    task_id = param.get('task_id') if param.get('task_id') != None else get_current_timestamp()                         # TaskId默认为当前时间

    # 指定数据文件
    head_id_list = param.get('head_id_list') if param.get('head_id_list') is not None else ""                           # 默认值为：""，格式为 2,3,4,5
    data_level = int(param.get('data_level')) if param.get('data_level') is not None else 1                             # 默认为1，即L2数据

    # 算法参数
    save_flag = int(param.get('save_flag')) if param.get('save_flag') is not None else 1                                # 画图结果存入数据库

    conf = {
        'TaskId': task_id,
        # 任务种类：0:数据录入；1:数据预处理；2:不确定度评定;3:数据分析数据处理;
        # 5:一键评定;6:评定结果查询（文件上传）；7:不确定度校验（文件上传）；8:数据比对不同设备；9:数据比对不同时间
        'SaveFlag': save_flag,
        'DataLevel': data_level,
        # 支持指定headIdList
        'HeadIdList': head_id_list,
        'FigureSavePath': draw_figure_save_path,
        'DbTable': db_raw_l2_precessed_table,
    }

    print("参数测试：")
    print(conf)

    # 筛选数据并画图
    try:
        start_time = time.time()    # 计时开始
        ret = drawUncertaintyAnalysisFigure(conf, conf['TaskId'])
        print("二维彩图画图：", ret)
        end_time = time.time()      # 计时结束
        #计算代码运行时间(ms)
        run_time = (end_time - start_time) * 1000
        #print('代码运行时间为{:.2f} s'.format(run_time))
        print('代码运行时间为%d ms' % run_time)

        # # 以tkinter窗口形式给出系统错误提示
        # if 'code' in ret.keys() and ret['code'] == -1:
        #     err_msg = ret['msg']
        #     print("错误：", err_msg)
        #     show_msg_to_tkinter(err_msg)

        # 成功生成二维彩图，并返回路径信息
        return ret

    except Exception as e:
        print("drawUncertaintyAnalysisFigure_Error: %s", e)
        # 以tkinter窗口形式给出系统错误提示
        # show_msg_to_tkinter(e)

    return 0


def drawUncertaintyAnalysisFigure(conf, TASK_ID):
    # 获取数据
    print("开始筛选文件数据阶段..")
    head_id_list = conf['HeadIdList']

    # 按查询条件获取探测数据（head_id_list）
    data_head_id_list = []
    probe_data_obj = {}

    # 查询流程：1）优先检查是否提供了headid，2）其次根据datasource判断是按条件检索或检索最近一次任务的结果
    if head_id_list != "":
        # 如果参数中指定了head_id_list
        print("参数指定了Head_id_list!优先处理..")
        # data_head_id_list = []
        head_id_list_arr = head_id_list.split(",")
        if len(head_id_list_arr) > 0:
            for head_id in head_id_list_arr:
                print(head_id)
                # 查询评定后的head数据
                # (1, 'T', 0, datetime.datetime(2023, 8, 13, 13, 0), datetime.datetime(2023, 8, 13, 14, 0), 1, 1, 'AL_LD1_T_20230813130057_L2.dat', 'raw_data/AL/System1/2023-08-13/13/L2/T')
                ret = getHeadIdInfoByHeadId(int(head_id), 2, 1)
                print(ret)
                if ret != "":
                    data_head_id_list.append(ret)

                # 获取原始数据
                raw_data = pdGetPreprocessedDataByHeadIdV3(int(head_id), conf)
                print(raw_data)
                if not raw_data.empty:
                    data_type = ret[1]
                    print(data_type)
                    print(probe_data_obj.keys())
                    if data_type not in probe_data_obj.keys():
                        probe_data_obj[data_type] = []

                    probe_data_obj[data_type].append(raw_data)
        else:
            print("参数head_id_list格式错误！")
            return {"code": -1, "msg": "参数错误：提供的参数head_id_list格式错误！"}
    else:
        return {"code": -1, "msg": "参数错误：未提供数据文件head_id（head_id_list为空）！"}

    print("检索到HearID数量：%d" % len(data_head_id_list))
    print(data_head_id_list)
    if len(data_head_id_list) == 0:
        print("未获取到探测数据！")
        return {"code": -1, "msg": "未获取到探测数据"}

    # 结果图保存路径
    save_path = conf['FigureSavePath']
    if not os.path.exists(save_path):
        try:
            os.makedirs(save_path)
        except Exception as e:
            print("创建路径报错：", e)
    else:
        # 清空文件夹数据
        clear_folder_shutil(save_path)

    # 1.合并同一参量类型多个dataframe为一个dataframe
    # 2.同时过滤只包含一条廓线的参量类型
    # print("画二维彩图参数（合并dataframe前）：", probe_data_obj)
    probe_data_obj_for_drawing = {}
    for data_type, df_list in probe_data_obj.items():
        # 过滤只包含一条廓线的参量类型
        if len(df_list)<2:
            continue

        df_merge = pd.DataFrame()
        index = 0
        for df in df_list:
            # print(data_type)
            # print(df)
            if index == 0:
                df_merge = df_list[0]
            else:
                df_merge = pd.concat([df_merge, df], axis=0)
            index += 1
        probe_data_obj_for_drawing[data_type] = df_merge
        # 输出到csv（测试用）
        # df_merge.to_csv('output_' + data_type + '.csv')

    # 调用接口画二维彩图
    # 检查画图廓线数据参数合法性
    if len(probe_data_obj_for_drawing) == 0:
        print("无符合画“时空分布图”的廓线数据！")
        return {"code": -1, "msg": "无符合画“时空分布图”的廓线数据！"}

    print("画二维彩图参数：", probe_data_obj_for_drawing)
    figure_conf = {
        "figure_location": save_path,     # 结果图保存路径
        "xx": "",         # 可扩展其他参数
    }

    # 将测试接口替换为新接口
    # result = draw2DFigureMock(probe_data_obj_for_drawing, figure_conf)
    result = draw2DFigure(probe_data_obj_for_drawing, figure_conf)
    print("二维彩图画图结束，返回：", result)

    ret_data = {}
    for key, value in result.items():
        param = {
            "BatchId": TASK_ID,
            "TaskType": 0,                  # 任务类型：0评定；1数据比对；2数据分析
            "FigureType": -1,               # 图片类型，适用于数据比对（0平均偏差、1标准偏差、2相关系数）
            "FigureName": "等值线二维彩图",
            "DataType": key,
            "ValueType": convertDataType2ValueType(key),
            "FigureLocation": value.replace("\\", "/"),
            "Remark": "不确定度评定结果画图"
        }
        ret_id = saveDrawFigureResultIntoDB(param)

        ret_data[param['DataType']] = {
            "FigureName": param['FigureName'],
            "FigureLocation": param['FigureLocation'],
        }
    if len(ret_data) == 0:
        return {"code": -1, "msg": "画图错误：未返回正确值！"}

    return {"code": 0, "msg": "成功", "data": ret_data}


# 测试接口
# 返回值需要包括：参量类型，图片的全路径，例如：
# ｛'T': "/figure/path/figure1.png", 'D': "/figure/path/figure2.png",  ...｝
def draw2DFigureMock(data_obj, figure_conf):
    obj = {'T': "/figure/path/figure1.png", 'D': "/figure/path/figure2.png"}
    return obj
